昨天我們定義了多益商務單字的語料格式,今天進入後端與全端開發非常關鍵的一步:資料庫實體關聯圖(ERD)規劃。
一個好的資料模型必須兼顧資料完整性與查詢效能。在我們的多益單字 App 中,除了單純儲存單字,更需要支援「商務情境分類」、「間隔重複複習進度」以及「錯題本記錄」。
為了避免資料冗餘並符合第三正規化(3NF),我們將系統拆為五張核心資料表:
users(使用者資料表)
categories(商務情境分類表)
vocabularies(單字核心表)
categories。user_vocab_progress(學習進度與記憶狀態表)
next_review_at)。quiz_questions & mistake_notebook(測驗題庫與錯題表)
quiz_questions:存放多益 Part 5 選擇題題幹、四個選項與正確解答。mistake_notebook:記錄使用者答錯的題目關聯、錯誤次數與最後答錯時間。我們用清楚的欄位結構來定義彼此的主鍵(PK)與外鍵(FK)關聯:
categories)id (PK, INT / UUID)name (VARCHAR, 情境名稱,如 "Information Technology")code (VARCHAR, 縮寫代碼,如 "IT")description (TEXT, 情境說明)vocabularies)id (PK, INT / UUID)category_id (FK, 關聯至 categories.id)word (VARCHAR, 單字)part_of_speech (VARCHAR, 詞性:noun, verb, adj...)meaning_zh (VARCHAR, 中文釋義)collocations (TEXT / JSON, 高頻搭配詞)example_sentence (TEXT, 職場情境英文例句)sentence_translation (TEXT, 例句中文翻譯)user_vocab_progress)id (PK)user_id (FK, 關聯至 users.id)vocab_id (FK, 關聯至 vocabularies.id)repetition_level (INT, 記憶階段 0~5)last_reviewed_at (TIMESTAMP, 上次複習時間)next_review_at (TIMESTAMP, 下次應複習時間,建立索引以利每日查詢)is_mastered (BOOLEAN, 是否已完全掌握)mistake_notebook)id (PK)user_id (FK, 關聯至 users.id)question_id (FK, 關聯至 quiz_questions.id)wrong_count (INT, 累積答錯次數)last_wrong_answer (VARCHAR, 上次選錯的選項)updated_at (TIMESTAMP)在設計這套 ERD 時,我們特別做了兩個考量:
vocabularies)資料量相對固定,可使用一般整數主鍵降低索引大小;但涉及使用者動態資料(如 user_vocab_progress 與測驗記錄),未來若走微服務或資料同步,採用 UUID 能夠有效避免 ID 衝突與爬蟲列舉。user_vocab_progress 表上,針對 (user_id, next_review_at) 建立複合索引(Composite Index),能讓查詢每日排程的 SQL 達到最佳效能。今天我們完成了系統的資料庫實體關聯設計,明確了實體之間的 1:N 與 N:M 映射關係。
明天 Day 4,我們將動手把今天的設計落地成真正的 SQL DDL 建立指令碼,並實際塞入第一批「IT 商務情境」的多益種子資料(Seed Data)!